package cap4;

class Libreta_Contactos{
/*Mantiene una colección de contactos ordenada por nombre. */
//Atributos de instancia
private Contacto [] T;
private int cant;
//Constructor
public Libreta_Contactos(int max){
    T = new Contacto [max];}
//Comandos
public void insertar (Contacto nuevo){
//Requiere que la colección no esté llena
    int pos = posInsercion(nuevo,cant);
    arrastrarDsp (pos,cant-pos);
    T[pos] = nuevo;
    cant++; }
private void arrastrarDsp (int pos,int n){
    if (n > 0){
       T[pos+n] = T[pos+n-1];
       arrastrarDsp(pos,--n);       } }
public void eliminar(Contacto con){
	/*Busca la posición de un contacto con el mismo nombre que con, si existe lo elimina arrastrando los que le siguen una posición  */
    int pos = posElemento (con,cant);
    if (pos < cant){
      arrastrarAnt(pos,cant-pos-1);
      cant--;} }
private void arrastrarAnt(int pos,int n){
 if (n > 0){
       T[pos] = T[pos+1];
       arrastrarAnt(++pos,--n);        }}
//Consultas
public int cantContactos (){
  return cant;}
public boolean estaLleno (){
  return cant == T.length;}
public boolean pertenece(Contacto con){
return posElemento(con,cant) < cant;}
private int  posInsercion (Contacto con,int n){
/* Retornar la posición del primer elemento mayor a con, o 0
Caso trivial: Si la colección está vacía la posición de inserción es 0
Caso trivial: Si el nombre del último contacto de la colección es menor al buscado, la posición de inserción es n
Caso Recursivo: Si el nombre del último contacto de la colección es mayor al buscado, busca la posición entre los primeros n-1 contactos de la colección*/
    int pos = 0;    
    if (n > 0)
      if (con.mayorNombre(T[n-1].obtenerNombre()) || 
          con.igualNombre(T[n-1].obtenerNombre()))
        pos = n;
      else
        if (T[n-1].mayorNombre(con.obtenerNombre()))
          pos  = posInsercion (con,--n);
    return pos;}
private int  posElemento(Contacto con,int n){
/* retorna la posición del elemento, o cant
Caso trivial: Si la colección está vacía el elemento no está y retorna cant
Caso trivial: Si el último elemento de la colección es menor al buscado, el elemento no está y retorna cant
Caso trivial: Si el último elemento de la colección es el buscado, la posición es n- 1
Caso Recursivo: Si el último elemento de la colección es mayor al buscado, busca la posición en los primeros n-1 elementos de la colección*/
    int pos=cant;
    if (n > 0)
      if (T[n-1].igualNombre(con.obtenerNombre())) 
         pos = n-1;
      else 
          if (T[n-1].mayorNombre(con.obtenerNombre()))
            pos  = posElemento (con,--n);
      return pos;}
  public void test(){
    for (int i=0;i<cant;i++)
      System.out.println(T[i].obtenerNombre());}
  }